package cn.aixuxi.notebank.service.impl;

import cn.aixuxi.notebank.dto.UserInputDTO;
import cn.aixuxi.notebank.entity.PermissionEntity;
import cn.aixuxi.notebank.entity.RoleEntity;
import cn.aixuxi.notebank.entity.UserEntity;
import cn.aixuxi.notebank.mapper.*;
import cn.aixuxi.notebank.service.UserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 类描述
 *
 * @author ruozhuliufeng
 * @version 1.0
 * @date 2020/10/24 20:07
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> implements UserService {
    @Autowired
    UserMapper userMapper;

    @Autowired
    private RolePermissionMapper rolePermissionMapper;

    @Autowired
    private PermissionMapper permissionMapper;

    @Autowired
    private RoleMapper roleMapper;

    @Autowired
    private SysUserRoleMapper sysUserRoleMapper;

    /**
     * 功能描述: 用户登录
     *
     * @param userInputDTO 用户登录信息
     * @return : 用户信息
     * @author : ruozhuliufeng
     * @date : 2020/10/24 21:19
     */
    @Override
    public UserEntity login(UserInputDTO userInputDTO) {
        return userMapper.login(userInputDTO);
    }

    /**
     * 功能描述: 根据用户名查找用户信息
     *
     * @param username 用户名
     * @return : 用户信息
     * @author : ruozhuliufeng
     * @date : 2020/11/15 23:16
     */
    @Override
    public UserEntity findByUsername(String username) {
        return userMapper.findByUsername(username);
    }

    /**
     * 功能描述: 根据用户名查找用户角色信息
     *
     * @param username 用户名
     * @return : 角色信息
     * @author : ruozhuliufeng
     * @date : 2020/12/9 11:26
     */
    @Override
    public Set<String> getUserRolesSetByUsername(String username) {
        // 根据用户名查找用户信息
        UserEntity user = this.findByUsername(username);
        // 根据用户ID查找用户角色信息
        List<Integer> roleIds = sysUserRoleMapper.findIdsByUserId(user.getId());
        // TODO 需要判断角色ID是否为空

        // 根据角色ID获取角色名称
        return roleIds.stream().map(item -> {
            RoleEntity roleEntity = roleMapper.selectById(item);
            return roleEntity.getRole();
        }).collect(Collectors.toSet());
    }

    /**
     * 功能描述: 根据用户名查找用户权限信息
     *
     * @param username 用户名
     * @return : 权限信息
     * @author : ruozhuliufeng
     * @date : 2020/12/9 11:27
     */
    @Override
    public Set<String> getUserPermissionsSetByUsername(String username) {
        // 根据用户名查找用户信息
        UserEntity user = this.findByUsername(username);
        // 根据用户ID查找用户角色信息
        List<Integer> roleIds = sysUserRoleMapper.findIdsByUserId(user.getId());

        // TODO 需要判断角色ID是否为空
        // 用户权限码集合
        Set<String> percode = new HashSet<>();
        // 根据角色ID获取权限ID
        for (Integer id : roleIds) {
            // 获得权限ID集合
            List<Integer> pids = rolePermissionMapper.findPermissionByRoleId(id);
            // 根据权限ID获取权限名称
            for (Integer pid : pids) {
                PermissionEntity permissionEntity = permissionMapper.selectById(pid);
                percode.add(permissionEntity.getPermission());
            }
        }
//        roleIds.stream().map(item -> {
//            // 根据角色ID获取权限ID
//            List<Integer> pids = rolePermissionMapper.findPermissionByRoleId(item);
//            // 根据权限ID获取权限名称
//            for (Integer id:pids) {
//                PermissionEntity permissionEntity = permissionMapper.selectById(id);
//                percode.add(permissionEntity.getName());
//            }
//            return null;
//        });
        return percode;
    }

    /**
     * 功能描述: 根据激活码获取用户信息
     *
     * @param activeCode 激活码
     * @return : 用户信息
     * @author : ruozhuliufeng
     * @date : 2020/12/29 13:59
     */
    @Override
    public UserEntity findByActiveCode(String activeCode) {
        QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("active_code", activeCode);
        return this.getBaseMapper().selectOne(queryWrapper);
    }

}
